import { orderBy } from "lodash-es";

import Decimal from "decimal.js";

import dayjs from "dayjs";
import utc from "dayjs/plugin/utc";
import timezone from "dayjs/plugin/timezone";

// 全局配置（可根据需要调整）
Decimal.set({
  precision: 20, // 有效数字总长度
  rounding: Decimal.ROUND_HALF_UP // 四舍五入
});
// 文件流下载文件

export const downloadFile = (res: any, name?: string) => {
  const blob = new Blob([res.data], {
    type: res.headers["content-type"] || "application/octet-stream"
  });
  let fileName = "result_file.csv";
  if (name) {
    fileName = name;
  } else {
    const disposition = res.headers["content-disposition"];
    if (disposition && disposition.indexOf("filename=") !== -1) {
      const fileNameMatch = disposition.match(/filename="?([^";]+)"?/);
      if (fileNameMatch && fileNameMatch.length > 1) {
        fileName = decodeURIComponent(fileNameMatch[1]);
      }
    }
  }
  const downloadUrl = window.URL.createObjectURL(blob);
  const link = document.createElement("a");
  link.href = downloadUrl;
  link.download = fileName;
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
  window.URL.revokeObjectURL(downloadUrl);
};

// 列表根据某个字段排序，默认降序
export const sortList = (list: any[], key = "sortOrder", desc = true) => {
  return orderBy(list, [key], desc ? ["desc"] : ["asc"]);
};

export const getFilenameFromDisposition = (disposition: string | null) => {
  if (!disposition) return undefined;
  // RFC 5987: filename*=UTF-8''xxx
  const utf8Match = disposition.match(/filename\*\s*=\s*UTF-8''([^;]+)/i);
  if (utf8Match) return decodeURIComponent(utf8Match[1]);
  // 简单形式 filename="xxx" or filename=xxx
  const normalMatch =
    disposition.match(/filename\s*=\s*"([^"]+)"/i) ||
    disposition.match(/filename\s*=\s*([^;]+)/i);
  return normalMatch ? normalMatch[1] : undefined;
};

/**
 * 加法
 * @param a 加数，支持 string 或 number
 * @param b 加数，支持 string 或 number
 * @returns Decimal 实例
 */
export function add(a: string | number, b: string | number): Decimal | number {
  if (!a) {
    return 0;
  }
  return new Decimal(a).plus(b);
}

/**
 * 减法
 * @param a 被减数，支持 string 或 number
 * @param b 减数，支持 string 或 number
 * @returns Decimal 实例
 */
export function subtract(
  a: string | number,
  b: string | number
): Decimal | number {
  if (!a) {
    return 0;
  }
  return new Decimal(a).minus(b);
}

/**
 * 乘法
 * @param a 乘数，支持 string 或 number
 * @param b 乘数，支持 string 或 number
 * @returns Decimal 实例
 */
export function multiply(
  a: string | number,
  b: string | number
): Decimal | number {
  if (!a) {
    return 0;
  }
  return new Decimal(a).times(b);
}

/**
 * 除法
 * @param a 被除数，支持 string 或 number
 * @param b 除数，支持 string 或 number
 * @returns Decimal 实例
 */
export function divide(
  a: string | number,
  b: string | number
): Decimal | number {
  if (!a) {
    return 0;
  }
  return new Decimal(a).dividedBy(b);
}

// 初始化插件
dayjs.extend(utc);
dayjs.extend(timezone);

/**
 * 自动检测时间格式，如果是UTC时间则转换为UTC+8（中国时区），否则原样返回
 * @param inputTime 输入时间（字符串、Date对象或Dayjs对象）
 * @param format 可选，指定返回的格式（如 'YYYY-MM-DD HH:mm:ss'），不传则返回Dayjs对象
 * @returns 格式化后的时间字符串或Dayjs对象
 */
export function handleAutoUTC8(timeStr: string, format?: string): string {
  if (!timeStr) {
    return "--";
  }
  const time = timeStr.endsWith("Z")
    ? dayjs(timeStr) // 如果带 Z，直接解析
    : dayjs.utc(timeStr); // 如果不带 Z，假设是 UTC

  const result = time.tz("Asia/Shanghai");
  return format ? result.format(format) : result.format("YYYY-MM-DD HH:mm:ss");
}
